/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * FrmActivaciones.java
 *
 * Created on 11/11/2012, 02:20:40 PM
 */

package co.edu.unitecnologica.interfaz;

import co.edu.unitecnologica.modelo.Activaciones;
import co.edu.unitecnologica.modelo.ActivacionesPK;
import co.edu.unitecnologica.modelo.Conceptos;
import co.edu.unitecnologica.modelo.ConceptosActivaciones;
import co.edu.unitecnologica.modelo.ConceptosActivacionesPK;
import co.edu.unitecnologica.modelo.ConceptosLiquidaciones;
import co.edu.unitecnologica.modelo.Estudiantes;
import co.edu.unitecnologica.modelo.Grupos;
import co.edu.unitecnologica.modelo.Liquidaciones;
import co.edu.unitecnologica.modelo.Programas;
import co.edu.unitecnologica.modelo.VariacionesConceptosPeriodos;
import java.awt.event.KeyEvent;
import java.sql.Connection;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityNotFoundException;
import javax.persistence.Query;
import javax.swing.DefaultCellEditor;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author osalcedo
 */
public class FrmActivaciones extends Formulario {
    private final Liquidaciones liquidacion;
    private double vlrCredito;
    private int creditosPrograma;
    private Collection<VariacionesConceptosPeriodos> variaciones;
    private DefaultTableModel dtmConceptos;
    private Activaciones activacion;

    /** Creates new form FrmActivaciones */
    public FrmActivaciones(Principal p, Liquidaciones l) {
        super(p);
        liquidacion=l;
        initComponents();
        habilitarCampos(false);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jcbConceptos = new javax.swing.JComboBox();
        jcbAccion = new javax.swing.JComboBox();
        jmiAgregarRegistro = new javax.swing.JMenuItem();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jtfId = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        jtfApellidosNombres = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        jcbRangos = new javax.swing.JComboBox();
        jLabel4 = new javax.swing.JLabel();
        jtfPrograma = new javax.swing.JTextField();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jtfPeriodo = new javax.swing.JTextField();
        jLabel7 = new javax.swing.JLabel();
        jtfNroComprobante = new javax.swing.JTextField();
        jtfTotalPagar = new javax.swing.JFormattedTextField();
        jLabel8 = new javax.swing.JLabel();
        jtfFechaActivacion = new javax.swing.JTextField();
        jPanel2 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jtConceptos = new javax.swing.JTable();

        jcbConceptos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jcbConceptosActionPerformed(evt);
            }
        });

        jcbAccion.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Ninguna", "Editar", "Borrar" }));
        jcbAccion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jcbAccionActionPerformed(evt);
            }
        });

        jmiAgregarRegistro.setText("Agregar medio de pago");
        jmiAgregarRegistro.setEnabled(false);
        jmiAgregarRegistro.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmiAgregarRegistroActionPerformed(evt);
            }
        });

        setTitle("Activar liquidacion");

        jLabel1.setText("ID:");

        jtfId.setEditable(false);

        jLabel2.setText("Apellidos y nombres:");

        jtfApellidosNombres.setEditable(false);

        jLabel3.setText("Rango:");

        jcbRangos.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "1-4", "5-9", "10-13", "14-20" }));

        jLabel4.setText("Total a Pagar:");

        jtfPrograma.setEditable(false);

        jLabel5.setText("Programa:");

        jLabel6.setText("Periodo:");

        jtfPeriodo.setEditable(false);

        jLabel7.setText("Nro. Comprobante:");

        jtfNroComprobante.setEditable(false);

        jtfTotalPagar.setEditable(false);
        jtfTotalPagar.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("¤#,##0"))));

        jLabel8.setText("Fecha Activación (aaaa/mm/dd):");

        jtfFechaActivacion.setEditable(false);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel4)
                    .addComponent(jLabel6)
                    .addComponent(jLabel3)
                    .addComponent(jLabel2)
                    .addComponent(jLabel1)
                    .addComponent(jLabel5))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(jtfId, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jtfPrograma)
                        .addGroup(jPanel1Layout.createSequentialGroup()
                            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(jcbRangos, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jtfPeriodo, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGap(18, 18, 18)
                            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(jLabel7, javax.swing.GroupLayout.Alignment.TRAILING)
                                .addComponent(jLabel8, javax.swing.GroupLayout.Alignment.TRAILING))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                .addComponent(jtfFechaActivacion)
                                .addComponent(jtfNroComprobante, javax.swing.GroupLayout.DEFAULT_SIZE, 110, Short.MAX_VALUE)))
                        .addComponent(jtfApellidosNombres))
                    .addComponent(jtfTotalPagar, javax.swing.GroupLayout.PREFERRED_SIZE, 165, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jtfId, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(jtfApellidosNombres, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jtfPrograma, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel5))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel6)
                    .addComponent(jtfPeriodo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jtfNroComprobante, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel7))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(jcbRangos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jtfFechaActivacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel8))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(jtfTotalPagar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jtConceptos.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Cod", "Descripcion", "Fecha pago", "Valor", "Accion"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Integer.class, java.lang.String.class, java.lang.String.class, java.lang.Double.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                true, false, true, true, true
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jtConceptos.setEnabled(false);
        jtConceptos.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                jtConceptosKeyPressed(evt);
            }
        });
        jScrollPane1.setViewportView(jtConceptos);

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 570, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 253, Short.MAX_VALUE)
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jcbConceptosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcbConceptosActionPerformed
        if(this.jtConceptos.getSelectedRow()>=0 && this.jtConceptos.getSelectedColumn()==0){
            int n=jtConceptos.getSelectedRow();
            String salida=this.jcbConceptos.getSelectedItem().toString();
            if(salida!=null){
                dtmConceptos.setValueAt(Integer.parseInt(salida.split("-")[0]), n, 0);
                dtmConceptos.setValueAt(salida.split("-")[1], n, 1);
                if(dtmConceptos.getValueAt(n, 2)!=null)
                    calcularPago();
            }
        }
    }//GEN-LAST:event_jcbConceptosActionPerformed

    private void jcbAccionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcbAccionActionPerformed
        if(this.jtConceptos.getSelectedRow()>=0 && this.jtConceptos.getSelectedColumn()==4){
            int n=jtConceptos.getSelectedRow();
            String accion=jcbAccion.getSelectedItem().toString();
            if(accion.equals("Borrar")){
                dtmConceptos.setValueAt(0, n, 3);
            }
        }
    }//GEN-LAST:event_jcbAccionActionPerformed

    private void jmiAgregarRegistroActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiAgregarRegistroActionPerformed
        Object[] fila= new Object[5];
        fila[4]="Nuevo";
        dtmConceptos.addRow(fila);
    }//GEN-LAST:event_jmiAgregarRegistroActionPerformed

    private void jtConceptosKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jtConceptosKeyPressed
        if(evt.getKeyCode()==KeyEvent.VK_ENTER){
            int fila=jtConceptos.getSelectedRow();
            int columna=jtConceptos.getSelectedColumn();
            if(columna==2){
                if(dtmConceptos.getValueAt(fila, columna)!=null)
                    calcularPago();
            }
        }
    }//GEN-LAST:event_jtConceptosKeyPressed


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JComboBox jcbAccion;
    private javax.swing.JComboBox jcbConceptos;
    private javax.swing.JComboBox jcbRangos;
    private javax.swing.JMenuItem jmiAgregarRegistro;
    private javax.swing.JTable jtConceptos;
    private javax.swing.JTextField jtfApellidosNombres;
    private javax.swing.JTextField jtfFechaActivacion;
    private javax.swing.JTextField jtfId;
    private javax.swing.JTextField jtfNroComprobante;
    private javax.swing.JTextField jtfPeriodo;
    private javax.swing.JTextField jtfPrograma;
    private javax.swing.JFormattedTextField jtfTotalPagar;
    // End of variables declaration//GEN-END:variables

    @Override
    public boolean insertarRegistro() {
        if(activacion==null){
            if(sumConceptosActivacion()==Double.parseDouble(jtfTotalPagar.getValue().toString())){
                try {
                    em.getTransaction().begin();
                    activacion = new Activaciones();
                    ActivacionesPK apk = new ActivacionesPK();
                    apk.setCodPeriodo(liquidacion.getLiquidacionesPK().getCodPeriodo());
                    apk.setCodPrograma(liquidacion.getLiquidacionesPK().getCodPrograma());
                    apk.setIdEstudiante(liquidacion.getLiquidacionesPK().getIdEstudiante());
                    apk.setSecuencia(liquidacion.getLiquidacionesPK().getSecuencia());
                    activacion.setActivacionesPK(apk);
                    activacion.setCreditos(Integer.parseInt(jcbRangos.getSelectedItem().toString().split("-")[0]));
                    SimpleDateFormat sdt = new SimpleDateFormat("yyyy/MM/dd");
                    activacion.setFechaActivacion(sdt.parse(jtfFechaActivacion.getText()));
                    activacion.setValor(sumConceptosActivacion());
                    activacion.setFechaActividad(Calendar.getInstance().getTime());
                    activacion.setHoraActividad(Calendar.getInstance().getTime());
                    activacion.setUsuario(principal.getUsuario().getUsuario());
                    em.persist(activacion);
                    liquidacion.setEstado("activado");
                    em.flush();
                    em.getTransaction().commit();
                    if(!procesarConceptosActivaciones())
                        JOptionPane.showMessageDialog(this, "Algunos Conceptos de Activacion no se lograron procesar de forma eficiente");
                    return true;
                } catch (ParseException ex) {
                    Logger.getLogger(FrmActivaciones.class.getName()).log(Level.SEVERE, null, ex);
                    em.getTransaction().rollback();
                    return false;
                }
            }
            else{
                JOptionPane.showMessageDialog(this, "La suma de los valores de los conceptos no coincide con el valor a pagar");
                return false;
            }
        }
        else{
            JOptionPane.showMessageDialog(this, "Registro de activacion ya existe");
            return false;
        }
    }

    @Override
    public boolean buscarRegistros() {
        JOptionPane.showMessageDialog(this, "Operacion no permitida para esta forma");
        return true;
    }

    @Override
    public boolean editarRegistro() {
        if(activacion!=null){
            if(sumConceptosActivacion()==Double.parseDouble(jtfTotalPagar.getValue().toString())){
                try {
                    em.getTransaction().begin();
                    activacion = new Activaciones();
                    ActivacionesPK apk = new ActivacionesPK();
                    apk.setCodPeriodo(liquidacion.getLiquidacionesPK().getCodPeriodo());
                    apk.setCodPrograma(liquidacion.getLiquidacionesPK().getCodPrograma());
                    apk.setIdEstudiante(liquidacion.getLiquidacionesPK().getIdEstudiante());
                    apk.setSecuencia(liquidacion.getLiquidacionesPK().getSecuencia());
                    activacion.setActivacionesPK(apk);
                    activacion.setCreditos(Integer.parseInt(jcbRangos.getSelectedItem().toString().split("-")[0]));
                    SimpleDateFormat sdt = new SimpleDateFormat("yyyy/MM/dd");
                    activacion.setFechaActivacion(sdt.parse(jtfFechaActivacion.getText()));
                    activacion.setValor(sumConceptosActivacion());
                    activacion.setFechaActividad(Calendar.getInstance().getTime());
                    activacion.setHoraActividad(Calendar.getInstance().getTime());
                    activacion.setUsuario(principal.getUsuario().getUsuario());
                    liquidacion.setEstado("activado");
                    em.flush();
                    em.getTransaction().commit();
                    if(!procesarConceptosActivaciones())
                        JOptionPane.showMessageDialog(this, "Algunos Conceptos de Activacion no se lograron procesar de forma eficiente");
                    return true;
                } catch (ParseException ex) {
                    Logger.getLogger(FrmActivaciones.class.getName()).log(Level.SEVERE, null, ex);
                    em.getTransaction().rollback();
                    return false;
                }
            }
            else{
                JOptionPane.showMessageDialog(this, "La suma de los valores de los conceptos no coincide con el valor a pagar");
                return false;
            }
        }
        else{
            JOptionPane.showMessageDialog(this, "Registro de activacion ya existe");
            return false;
        }
    }

    @Override
    public boolean borrarRegistro() {
        if(activacion!=null){
            try{
                em.getTransaction().begin();
                em.remove(activacion);
                liquidacion.setEstado("liquidado");
                em.flush();
                em.getTransaction().commit();
                return true;
            }catch(Exception ex){
                Logger.getLogger(FrmActivaciones.class.getName()).log(Level.SEVERE, null, ex);
                em.getTransaction().rollback();
                return false;
            }
        }
        else{
            JOptionPane.showMessageDialog(this, "Registro de activacion no existe");
            return false;
        }
    }

    @Override
    public void cargarRegistros() {
        init();
    }

    @Override
    public void limpiarCampos() {
        this.jtfFechaActivacion.setText("");
        this.jtfTotalPagar.setText("");
        this.dtmConceptos.setRowCount(0);
    }

    @Override
    public void habilitarCampos(boolean v) {
        this.jtfFechaActivacion.setEditable(v);
        this.jcbRangos.setEnabled(v);
        this.jmiAgregarRegistro.setEnabled(v);
        this.jtConceptos.setEnabled(v);
    }

    @Override
    public void agregarItemsMenuOpciones() {
        principal.getJmOpciones().add(jmiAgregarRegistro);
    }

    @Override
    public void mostrarRegistro(int r) {
        if(activacion!=null){
            init();
        }
    }

    private void init() {
        em.getEntityManagerFactory().getCache().evictAll();
        ActivacionesPK pk=new ActivacionesPK();
        pk.setCodPeriodo(liquidacion.getLiquidacionesPK().getCodPeriodo());
        pk.setCodPrograma(liquidacion.getLiquidacionesPK().getCodPrograma());
        pk.setIdEstudiante(liquidacion.getLiquidacionesPK().getIdEstudiante());
        pk.setSecuencia(liquidacion.getLiquidacionesPK().getSecuencia());
        try{
            activacion=em.getReference(Activaciones.class, pk);
        }catch(EntityNotFoundException e){
            activacion=null;
        }
        jtfId.setText(liquidacion.getLiquidacionesPK().getIdEstudiante());
        jtfPeriodo.setText(String.valueOf(liquidacion.getLiquidacionesPK().getCodPeriodo()));
        jtfApellidosNombres.setText(liquidacion.getEstudiantes().getApellidos()+", "+liquidacion.getEstudiantes().getNombres());
        Programas programa=liquidacion.getEstudiantes().getProgramas();
        jtfPrograma.setText(programa.getDescripcion());
        creditosPrograma=programa.getCreditosTotales();
        jtfNroComprobante.setText(String.valueOf(liquidacion.getNumeroComprobante()));
        vlrCredito=this.getValorMatricula()/creditosPrograma;
        Estudiantes e=liquidacion.getEstudiantes();
        String sql="select f_dar_grupo('"+e.getEstudiantesPK().getId()
                   +"','"+e.getEstudiantesPK().getCodPrograma()+"') from dual";
        Query q = em.createNativeQuery(sql);
        q.setHint("javax.persistence.cache.storeMode", "REFRESH");
        int grupo=Integer.parseInt(q.getSingleResult().toString());
        Grupos g=em.getReference(Grupos.class, grupo);
        variaciones=g.getVariacionesConceptosPeriodosCollection();
        q=em.createNamedQuery("Conceptos.findAll", Conceptos.class);
        q.setHint("javax.persistence.cache.storeMode", "REFRESH");
        List l = q.getResultList();
        for(int i=0;i<l.size();i++){
            Conceptos c=(Conceptos)l.get(i);
            if(c.getCodTipoConcepto().getCod()==2)
                jcbConceptos.addItem(c.getCod()+"-"+c.getDescripcion());
        }
        jtConceptos.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(jcbConceptos));
        jtConceptos.getColumnModel().getColumn(4).setCellEditor(new DefaultCellEditor(jcbAccion));
        dtmConceptos=(DefaultTableModel) jtConceptos.getModel();
        jtConceptos.setModel(dtmConceptos);
        if(activacion!=null){
            SimpleDateFormat sdf= new SimpleDateFormat("yyyy/MM/dd");
            jtfFechaActivacion.setText(sdf.format(activacion.getFechaActivacion()));
            for(int i=0;i<this.jcbRangos.getItemCount();i++){
                int li=Integer.parseInt(jcbRangos.getItemAt(i).toString().split("-")[0]);
                int ls=Integer.parseInt(jcbRangos.getItemAt(i).toString().split("-")[1]);
                int cr=activacion.getCreditos();
                if(li<=cr && cr<=ls)
                    jcbRangos.setSelectedIndex(i);
            }
            cargarConceptosActivaciones();
            calcularPago();
            setRegistroActual(0);
            setRegistrosTotales(1);
        }
        setRegistroActual(0);
        setRegistrosTotales(0);
    }

    private double getValorMatricula(){
        Collection<ConceptosLiquidaciones> conceptosLiquidacion = liquidacion.getConceptosLiquidacionesCollection();
        Iterator<ConceptosLiquidaciones> iteradorConceptos = conceptosLiquidacion.iterator();
        while(iteradorConceptos.hasNext()){
            ConceptosLiquidaciones concepto = iteradorConceptos.next();
            if(concepto.getConceptos().getCod()==1) //concepto de matricula
                return concepto.getValor();
        }
        return 0.0;
    }

    private double getTotalPagar(int creditos, Date fecha, boolean variacion){
        double valor=0.0;
        double porcentaje=0.0;
        Conceptos conceptoMatricula = null;
        boolean esAntiguo=true;
        boolean tieneDescuentos=false;
        Estudiantes estudiante = liquidacion.getEstudiantes();
        Programas programa=estudiante.getProgramas();
        if(estudiante.getCodTipoEstudiante().getCod().equals("N")||estudiante.getCodTipoEstudiante().getCod().equals("T"))
            esAntiguo=false;
        Collection<ConceptosLiquidaciones> conceptosLiquidacion = liquidacion.getConceptosLiquidacionesCollection();
        Iterator<ConceptosLiquidaciones> iteradorConceptos = conceptosLiquidacion.iterator();
        while(iteradorConceptos.hasNext()){
            ConceptosLiquidaciones conceptoliq = iteradorConceptos.next();
            if(conceptoliq.getConceptos().getCod()!=1){ //conceptos diferentes a matricula
                if(conceptoliq.getConceptos().getModoCalculo()=='P'){
                    if(conceptoliq.getValor()<0)
                        tieneDescuentos=true;
                    porcentaje+=conceptoliq.getValor()+((variacion)?getPorcentajeVariacionConcepto(conceptoliq.getConceptos(), fecha):0);
                }
                else
                    valor+=conceptoliq.getValor()*(1+((variacion)?getPorcentajeVariacionConcepto(conceptoliq.getConceptos(), fecha):0)/100);
            }
            else
                conceptoMatricula=conceptoliq.getConceptos();
        }
        double valor_base=getValorMatricula()*creditos/programa.getCreditosTotales();
        double total=0.0;
        double extemporanea=0.0;
        if(tieneDescuentos){
            if(getPorcentajeVariacionConcepto(conceptoMatricula, fecha)>0) //variacion extemporanea
                extemporanea+= getPorcentajeVariacionConcepto(conceptoMatricula, fecha);
            total= valor_base*(1+extemporanea/100)*(1.0+porcentaje/100.0); //no aplica variacion de matricula
        }
        else
            total= valor_base*(1.0+((variacion?porcentaje+getPorcentajeVariacionConcepto(conceptoMatricula, fecha):0))/100.0);
        total+=valor;
        return (double)Math.round(total);
    }

    private double getPorcentajeVariacionConcepto(Conceptos concepto,Date fecha){
       Iterator<VariacionesConceptosPeriodos> itVariaciones = this.getVariacionesConceptos().iterator();
        double porcentaje=0.0;
        while(itVariaciones.hasNext()){
            VariacionesConceptosPeriodos v = itVariaciones.next();
            if(fecha.after(v.getFechaDesde())&&fecha.before(v.getFechaHasta())&&v.getVariacionesConceptosPeriodosPK().getCodPeriodo()==liquidacion.getLiquidacionesPK().getCodPeriodo()){
                if(concepto.equals(v.getConceptos())){
                    porcentaje+=v.getPorcentaje();
                }
            }
        }
        return porcentaje;
    }

    private void calcularPago(){
        int creditos=Integer.parseInt(this.jcbRangos.getSelectedItem().toString().split("-")[1]);
        if(creditos==20){
            creditos=creditosPrograma;
        }        
        Date fecha=new Date();
        DateFormat format = new java.text.SimpleDateFormat("yyyy/MM/dd");
        try{
            fecha= format.parse("1970/01/01");
        }catch(Exception e){}
        for(int i=0;i<dtmConceptos.getRowCount();i++){
            try{
                String d=dtmConceptos.getValueAt(i, 2).toString();
                Date f=format.parse(d);
                if(f.after(fecha))
                    fecha=f;
            } catch (ParseException ex) {
                JOptionPane.showMessageDialog(this, "La fecha introducida tiene el formato incorrecto (aaaa/mm/dd)");
            }
        }
        if(fecha!=null){
            boolean aplicaVariacion=true;
            for(int i=0;i<this.dtmConceptos.getRowCount();i++){
                Conceptos c=em.getReference(Conceptos.class, Integer.parseInt(dtmConceptos.getValueAt(i, 0).toString()));
                if(c.getAplicaVariacion()=='N'){
                    aplicaVariacion=false;
                    break;
                }
            }
            jtfTotalPagar.setValue(getTotalPagar(creditos,fecha, aplicaVariacion));
        }
    }

    private Collection<VariacionesConceptosPeriodos> getVariacionesConceptos(){
         Estudiantes e=liquidacion.getEstudiantes();
         String sql="select f_dar_grupo('"+e.getEstudiantesPK().getId()
            +"','"+e.getEstudiantesPK().getCodPrograma()+"') from dual";
         Query q = em.createNativeQuery(sql);
         q.setHint("javax.persistence.cache.storeMode", "REFRESH");
         int grupo=Integer.parseInt(q.getSingleResult().toString());
         Grupos g=em.getReference(Grupos.class, grupo);
         return g.getVariacionesConceptosPeriodosCollection();
     }

    private void cargarConceptosActivaciones() {
        dtmConceptos.setRowCount(0);
        if(activacion!=null){
            em.refresh(activacion);
            em.getTransaction().begin();
            em.flush();
            em.getTransaction().commit();
            ActivacionesPK pk=activacion.getActivacionesPK();
            String sql="select * from conceptos_activaciones " +
                    "where cod_periodo='"+pk.getCodPeriodo()+"' " +
                    "and cod_programa='"+pk.getCodPrograma()+"' " +
                    "and id_estudiante='"+pk.getIdEstudiante()+"' " +
                    "and secuencia='"+pk.getSecuencia()+"'";
            Query q = em.createNativeQuery(sql, ConceptosActivaciones.class);
            q.setHint("javax.persistence.cache.storeMode", "REFRESH");
            List l = q.getResultList();
            for(int k=0;k<l.size();k++){
                ConceptosActivaciones conceptoActivacion = (ConceptosActivaciones) l.get(k);
                SimpleDateFormat sdf= new SimpleDateFormat("yyyy/MM/dd");
                Object[] fila= new Object[5];
                fila[0]=conceptoActivacion.getConceptosActivacionesPK().getCodConcepto(); //codigo
                fila[1]=conceptoActivacion.getConceptos().getDescripcion(); //descripcion
                fila[2]=sdf.format(conceptoActivacion.getConceptosActivacionesPK().getFechaPago()); //fecha pago
                fila[3]=conceptoActivacion.getValor(); //valor
                fila[4]="Ninguna"; //codigo
                dtmConceptos.addRow(fila);
            }
        }
    }

    private double sumConceptosActivacion(){
        double suma=0.0;
        for(int i=0;i<this.dtmConceptos.getRowCount();i++){
            suma+=Double.parseDouble(dtmConceptos.getValueAt(i, 3).toString());
        }
        return suma;
    }

    private boolean procesarConceptosActivaciones() {
        Conceptos conceptoEntidad;
        Programas programa;
        boolean hecho=true;
        if(activacion!=null){
            for(int i=0;i<this.dtmConceptos.getRowCount();i++){
                if(!dtmConceptos.getValueAt(i, 4).toString().equals("Ninguna")){
                    if(dtmConceptos.getValueAt(i, 4).toString().equals("Nuevo")){
                        try {
                            em.getTransaction().begin();
                            programa = liquidacion.getEstudiantes().getProgramas();
                            conceptoEntidad = em.getReference(Conceptos.class, Integer.parseInt(dtmConceptos.getValueAt(i, 0).toString()));
                            ConceptosActivaciones ca = new ConceptosActivaciones();
                            ConceptosActivacionesPK capk = new ConceptosActivacionesPK();
                            capk.setCodConcepto(Integer.parseInt(dtmConceptos.getValueAt(i, 0).toString()));
                            capk.setCodPeriodo(activacion.getActivacionesPK().getCodPeriodo());
                            capk.setCodPrograma(activacion.getActivacionesPK().getCodPrograma());
                            capk.setIdEstudiante(activacion.getActivacionesPK().getIdEstudiante());
                            capk.setSecuencia(activacion.getActivacionesPK().getSecuencia());
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
                            capk.setFechaPago(sdf.parse(dtmConceptos.getValueAt(i, 2).toString()));
                            ca.setConceptosActivacionesPK(capk);
                            ca.setValor(Double.parseDouble(dtmConceptos.getValueAt(i, 3).toString()));
                            if (conceptoEntidad.getCodAuxiliar() != null) {
                                ca.setCodAuxiliar(conceptoEntidad.getCodAuxiliar());
                            } else {
                                ca.setCodAuxiliar(programa.getCodAuxiliar());
                            }
                            if (conceptoEntidad.getCentroCosto() != null) {
                                ca.setCentroCosto(conceptoEntidad.getCentroCosto());
                            } else {
                                ca.setCentroCosto(programa.getCentroCosto());
                            }
                            if (conceptoEntidad.getNit() != null) {
                                ca.setNit(conceptoEntidad.getNit());
                            } else {
                                ca.setNit(programa.getNit());
                            }
                            ca.setTipoCuenta(conceptoEntidad.getTipoCuenta());
                            ca.setNumeroCuenta(conceptoEntidad.getNumeroCuenta());
                            em.persist(ca);
                            em.getTransaction().commit();
                        } catch (Exception ex) {
                            Logger.getLogger(FrmActivaciones.class.getName()).log(Level.SEVERE, null, ex);
                            em.getTransaction().rollback();
                            hecho=false;
                        }
                    }
                    else if(dtmConceptos.getValueAt(i, 4).toString().equals("Editar")){
                        try {
                            em.getTransaction().begin();
                            programa = liquidacion.getEstudiantes().getProgramas();
                            conceptoEntidad = em.getReference(Conceptos.class, Integer.parseInt(dtmConceptos.getValueAt(i, 0).toString()));
                            ConceptosActivacionesPK capk = new ConceptosActivacionesPK();
                            capk.setCodConcepto(Integer.parseInt(dtmConceptos.getValueAt(i, 0).toString()));
                            capk.setCodPeriodo(activacion.getActivacionesPK().getCodPeriodo());
                            capk.setCodPrograma(activacion.getActivacionesPK().getCodPrograma());
                            capk.setIdEstudiante(activacion.getActivacionesPK().getIdEstudiante());
                            capk.setSecuencia(activacion.getActivacionesPK().getSecuencia());
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
                            capk.setFechaPago(sdf.parse(dtmConceptos.getValueAt(i, 2).toString()));
                            ConceptosActivaciones ca=em.getReference(ConceptosActivaciones.class, capk);
                            ca.setValor(Double.parseDouble(dtmConceptos.getValueAt(i, 3).toString()));
                            if (conceptoEntidad.getCodAuxiliar() != null) {
                                ca.setCodAuxiliar(conceptoEntidad.getCodAuxiliar());
                            } else {
                                ca.setCodAuxiliar(programa.getCodAuxiliar());
                            }
                            if (conceptoEntidad.getCentroCosto() != null) {
                                ca.setCentroCosto(conceptoEntidad.getCentroCosto());
                            } else {
                                ca.setCentroCosto(programa.getCentroCosto());
                            }
                            if (conceptoEntidad.getNit() != null) {
                                ca.setNit(conceptoEntidad.getNit());
                            } else {
                                ca.setNit(programa.getNit());
                            }
                            ca.setTipoCuenta(conceptoEntidad.getTipoCuenta());
                            ca.setNumeroCuenta(conceptoEntidad.getNumeroCuenta());
                            em.getTransaction().commit();
                        } catch (Exception ex) {
                            Logger.getLogger(FrmActivaciones.class.getName()).log(Level.SEVERE, null, ex);
                            em.getTransaction().rollback();
                            hecho=false;
                        }
                    }
                    else if(dtmConceptos.getValueAt(i, 4).toString().equals("Borrar")){
                        try {
                            em.getTransaction().begin();
                            ConceptosActivacionesPK capk = new ConceptosActivacionesPK();
                            capk.setCodConcepto(Integer.parseInt(dtmConceptos.getValueAt(i, 0).toString()));
                            capk.setCodPeriodo(activacion.getActivacionesPK().getCodPeriodo());
                            capk.setCodPrograma(activacion.getActivacionesPK().getCodPrograma());
                            capk.setIdEstudiante(activacion.getActivacionesPK().getIdEstudiante());
                            capk.setSecuencia(activacion.getActivacionesPK().getSecuencia());
                            ConceptosActivaciones ca=em.getReference(ConceptosActivaciones.class, capk);
                            em.remove(ca);
                            em.getTransaction().commit();
                        } catch (Exception ex) {
                            Logger.getLogger(FrmActivaciones.class.getName()).log(Level.SEVERE, null, ex);
                            em.getTransaction().rollback();
                            hecho=false;
                        }
                    }
                }
                
            }
        }
        return hecho;
    }

}
